package com.itheima.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * <dl>
 * <dd>描述: ~节点业务逻辑实现</dd>
 * <dd>创建时间：  9:45 2020/7/27</dd>
 * <dd>创建人： zz</dd>
 * <dt>版本历史: </dt>
 * <pre>
 * Date         Author      Version     Description
 * ------------------------------------------------------------------
 * 2020/7/27      guodong       1.0        1.0 Version
 * </pre>
 * </dl>
 */
@Configuration
public class QueueBean {

    /*
        第一个参数：队列名称
        第二个参数：是否持久化---默认true
        第三个参数：是否排外(排除其他消费者)----默认false,如果设置为true只会允许一个消费者消费队列中的消息
        第四个参数：是否自动删除---》默认false

     */
    @Bean
    public Queue orderA(){
        return new Queue("order.A",true,false,false);
    }

    /*
       第一个参数：交换机名称
       第二个参数：是否持久化---默认true
       第三个参数：是否自动删除---》默认false

    */
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("order_dirext_ex", true, false);
    }

    /*
        绑定队列

        UserService  接口

        UserServiceImpl1
        UserServiceImpl2

        @Qualifier("directExchange")
     */
    @Bean
    Binding bindingOrderA(DirectExchange directExchange, Queue orderA){
        return BindingBuilder.bind(orderA).to(directExchange).with("order");
    }

    /*
        创建过期队列
     */
    @Bean
    public Queue orderB(){
        Map<String, Object> map = new HashMap<>();
        //5000单位是毫秒，表示5秒后过期
        map.put("x-message-ttl", 5000);
        //设置交换机
        map.put("x-dead-letter-exchange", "order_del_ex");
        //设置路由key
        map.put("x-dead-letter-routing-key", "order_del");
        return new Queue("order.B",true,false,false, map);
    }
    /*
        绑定过期时间队列至交换机
     */
    @Bean
    Binding bindingOrderB(DirectExchange directExchange, Queue orderB){
        return BindingBuilder.bind(orderB).to(directExchange).with("orderB");
    }

    /*
        创建死信队列
     */
    @Bean
    public Queue delQueue(){
        return new Queue("order_del_queue");
    }

    /*
        创建死信交换机
     */
    @Bean
    public DirectExchange delDirectExchange(){
        return new DirectExchange("order_del_ex");
    }
    /*
        绑定
     */
    @Bean
    Binding bindingDelQueue(DirectExchange delDirectExchange,Queue delQueue){
        return BindingBuilder.bind(delQueue).to(delDirectExchange).with("order_del");
    }

}
